#ifndef CACHEREBUILDMANAGER_H
#define CACHEREBUILDMANAGER_H

#include <QObject>
#include <QTimer>
#include "unifiedfileinfo.h"
#include "systemconfig.h"

/**
 * Martin Fowler重构：缓存重建管理器
 *
 * 职责：统一管理缓存重建操作，复用现有文件处理管道
 * 设计原则：
 * - Single Responsibility：专门负责缓存重建的协调
 * - Tell, Don't Ask：委托给现有组件，不直接处理细节
 * - Extract Class：从MainWindow中提取重建逻辑
 */
class CacheRebuildManager : public QObject
{
    Q_OBJECT

public:
    explicit CacheRebuildManager(QObject* parent = nullptr);

    /**
     * 分析配置变更并决定重建策略
     * @param oldConfig 旧配置
     * @param newConfig 新配置
     * @return 是否需要重建缓存
     */
    bool analyzeConfigChange(const SystemConfig& oldConfig,
                            const SystemConfig& newConfig);

    /**
     * 执行缓存重建操作
     * 复用现有的文件处理管道，确保UI和用户体验一致
     */
    void executeCacheRebuild();

    /**
     * 设置文件列表（用于重建）
     */
    void setFileList(const QList<UnifiedFileInfo>& files);

    /**
     * 设置当前文件路径（重建完成后恢复）
     */
    void setCurrentFilePath(const QString& filePath);

signals:
    /**
     * 重建完成信号
     */
    void rebuildCompleted();

    /**
     * 重建进度信号（可选，用于Toast提示）
     */
    void rebuildProgress(const QString& message);

private slots:
    /**
     * 延迟执行重建（避免阻塞UI）
     */
    void delayedRebuild();

private:
    /**
     * 判断是否只有DPI变更
     */
    bool isDPIOnlyChange(const SystemConfig& oldConfig,
                        const SystemConfig& newConfig);

    /**
     * 判断缓存目录是否变更
     */
    bool isCacheDirectoryChanged(const SystemConfig& oldConfig,
                                const SystemConfig& newConfig);

    /**
     * 生成Toast提示消息
     */
    QString generateRebuildMessage(const SystemConfig& oldConfig,
                                 const SystemConfig& newConfig);

private:
    QList<UnifiedFileInfo> m_files;
    QString m_currentFilePath;
    SystemConfig m_oldConfig;
    SystemConfig m_newConfig;
    QTimer* m_delayTimer;

    // 延迟执行时间（毫秒）
    static constexpr int REBUILD_DELAY_MS = 500;
};

#endif // CACHEREBUILDMANAGER_H